home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / oper_sys / kerberos / pc / krb_libd.lha / Lib / Des / STRTOKEY.C < prev    next >
Encoding:
C/C++ Source or Header  |  1991-06-03  |  3.2 KB  |  125 lines

  1. /*
  2.  * $Source: /afs/athena.mit.edu/astaff/project/kerberos/src/lib/des/RCS/string_to_key.c,v $
  3.  * $Author: jtkohl $
  4.  *
  5.  * Copyright 1985, 1986, 1987, 1988, 1989 by the Massachusetts Institute
  6.  * of Technology.
  7.  *
  8.  * For copying and distribution information, please see the file
  9.  * <mit-copyright.h>.
  10.  *
  11.  * These routines perform encryption and decryption using the DES
  12.  * private key algorithm, or else a subset of it-- fewer inner loops.
  13.  * (AUTH_DES_ITER defaults to 16, may be less.)
  14.  *
  15.  * Under U.S. law, this software may not be exported outside the US
  16.  * without license from the U.S. Commerce department.
  17.  *
  18.  * The key schedule is passed as an arg, as well as the cleartext or
  19.  * ciphertext.  The cleartext and ciphertext should be in host order.
  20.  *
  21.  * These routines form the library interface to the DES facilities.
  22.  *
  23.  *    spm    8/85    MIT project athena
  24.  */
  25.  
  26. #ifndef    lint
  27. static char rcsid_string_to_key_c[] =
  28. "$Id: string_to_key.c,v 4.11 90/01/02 13:46:38 jtkohl Exp $";
  29. #endif    lint
  30.  
  31. #include <mit_copy.h>
  32. #include <stdio.h>
  33. #include <des.h>
  34. #include "des_intn.h"
  35.  
  36. extern int des_debug;
  37. extern int des_debug_print();
  38. extern void des_fixup_key_parity();
  39.  
  40. /*
  41.  * convert an arbitrary length string to a DES key
  42.  */
  43. int
  44. des_string_to_key(str,key)
  45.     char *str;
  46.     register des_cblock *key;
  47. {
  48.     register char *in_str;
  49.     register unsigned temp,i;
  50.     register int j;
  51.     register long length;
  52.     static unsigned char *k_p;
  53.     static int forward;
  54.     register char *p_char;
  55.     static char k_char[64];
  56.     static des_key_schedule key_sked;
  57.     extern unsigned long des_cbc_cksum();
  58.  
  59.     in_str = str;
  60.     forward = 1;
  61.     p_char = k_char;
  62.     length = strlen(str);
  63.  
  64.     /* init key array for bits */
  65.     memset(k_char,0,sizeof(k_char));
  66.  
  67. #ifdef DEBUG
  68.     if (des_debug)
  69.     fprintf(stdout,
  70.         "\n\ninput str length = %d  string = %s\nstring = 0x ",
  71.         length,str);
  72. #endif
  73.  
  74.     /* get next 8 bytes, strip parity, xor */
  75.     for (i = 1; i <= length; i++) {
  76.     /* get next input key byte */
  77.     temp = (unsigned int) *str++;
  78. #ifdef DEBUG
  79.     if (des_debug)
  80.         fprintf(stdout,"%02x ",temp & 0xff);
  81. #endif
  82.     /* loop through bits within byte, ignore parity */
  83.     for (j = 0; j <= 6; j++) {
  84.         if (forward)
  85.         *p_char++ ^= (int) temp & 01;
  86.         else
  87.         *--p_char ^= (int) temp & 01;
  88.         temp = temp >> 1;
  89.     } while (--j > 0);
  90.  
  91.     /* check and flip direction */
  92.     if ((i%8) == 0)
  93.         forward = !forward;
  94.     }
  95.  
  96.     /* now stuff into the key des_cblock, and force odd parity */
  97.     p_char = k_char;
  98.     k_p = (unsigned char *) key;
  99.  
  100.     for (i = 0; i <= 7; i++) {
  101.     temp = 0;
  102.     for (j = 0; j <= 6; j++)
  103.         temp |= *p_char++ << (1+j);
  104.     *k_p++ = (unsigned char) temp;
  105.     }
  106.  
  107.     /* fix key parity */
  108.     des_fixup_key_parity(key);
  109.  
  110.     /* Now one-way encrypt it with the folded key */
  111.     (void) des_key_sched(key,key_sked);
  112.     (void) des_cbc_cksum((des_cblock *)in_str,key,length,key_sked,key);
  113.     /* erase key_sked */
  114.     memset((char *)key_sked,0,sizeof(key_sked));
  115.  
  116.     /* now fix up key parity again */
  117.     des_fixup_key_parity(key);
  118.  
  119.     if (des_debug)
  120.     fprintf(stdout,
  121.         "\nResulting string_to_key = 0x%x 0x%x\n",
  122.         *((unsigned long *) key),
  123.         *((unsigned long *) key+1));
  124. }
  125.